package com.yanggu.scala.chapater18.viewbounds

//视图界定(View Bounds)
//<% 的意思是“view bounds”(视界)，它比<:适用的范围更广，除了所有的子类型，还允许隐式转换类型。
//def method[A <% B](argList): R = ... 等价于:
//def method[A](argList)(implicit viewAB: A => B): R = ...
//并且在调用的地方必须存在相应的隐式转换 A => B
//或等价于: implicit def conver(a:A): B = …
//<% 除了方法使用之外，class 声明类型参数时也可使用：
//class A[T <% Int]
object ViewBoundsDemo01 {

  def main(args: Array[String]): Unit = {
    val value = new CompareComm11(10, 20)
    println(value.greater)
  }

}

/**
 * 视图界定已经过期了, 推荐使用隐式参数的方式, 科里化的方式写隐式参数
 */
class CompareComm11[T <% Comparable[T]](obj1: T, obj2: T) {
//等价于下面的写法。其中(implicit ev$1: T => Comparable[T])是柯里化的写法。
//ev$1 可以任意写, 是函数名
//class CompareComm11[T](obj1: T, obj2: T)(implicit ev$1: T => Comparable[T]) {

  def greater = if (obj1.compareTo(obj2) > 0) obj1 else obj2

}
